/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package practica1.ui.dialog;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.*;
import practica1.Practica1;
import practica1.language.Language;
import practica1.logic.LogicExperimento;
import practica1.logic.LogicPoblacion;

/**
 * JDialog que permite crear una nueva población
 * @author Miguel González - Ceura
 */
public class DialogNuevaPoblacion  extends JDialog  {
    public static final int CANCELAR = 0;
    public static final int ACEPTAR = 1;
    
    private JTextField txtNombrePoblacion;
    private JLabel lblAviso;
    private int action = 0;
    private LogicExperimento experimento;
    
    /**
     * Constructor del JDialog
     * @param parent Frame sobre el que se localiza
     * @param experimento LogicExperimento al que se agrega la población
     */
    public DialogNuevaPoblacion(Frame parent, LogicExperimento experimento) {
        super(parent);
        
        this.experimento = experimento;
        
        init();
        
        setLocationRelativeTo(parent);
    }
    
    /**
     * Constructor del JDialog
     * @param experimento LogicExperimento al que se agrega la población
     */
    public DialogNuevaPoblacion(LogicExperimento experimento) {
        super();
        
        this.experimento = experimento;
        
        init();
        
        setLocationRelativeTo(null);
    }
    
    /**
     * Inicializa los componentes Swing
     */
    private void init() {
        Container contentPane = getContentPane();
        setSize(500, 150);
        setTitle(Language.getI().getP("NUEVA_POBLACION"));
        setModal(true);
        contentPane.setLayout(new BorderLayout());

        //Inicializamos los componentes Swing
        JLabel lblNombrePoblacion = new JLabel(
                Language.getI().getP("NOMBRE_POBLACION"));
        txtNombrePoblacion = new JTextField(10);
        txtNombrePoblacion.addKeyListener(new CambioNombrePoblacion());
        txtNombrePoblacion.addActionListener(new PulsadoIntro());
        
        lblAviso = new JLabel();
        lblAviso.setForeground(Color.RED);
        
        JButton btnAceptar = new JButton(Language.getI().getP("ACEPTAR"));
        btnAceptar.addActionListener(new PulsadoAceptar());
        JButton btnCancelar = new JButton(Language.getI().getP("CANCELAR"));
        btnCancelar.addActionListener(new PulsadoCancelar());
        
        //Panel superior
        JPanel panelSuperior = new JPanel();
        panelSuperior.add(new JLabel(
                Language.getI().getP("PROPIEDADES_POBLACION")));
        contentPane.add(panelSuperior, BorderLayout.NORTH);
        
        //Panel centro
        JPanel panelCentro = new JPanel(new GridBagLayout());
        panelCentro.setBorder(BorderFactory.createEmptyBorder(15,5,5,5));
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipadx = 10;
        
        c.gridx = 0;
        c.gridy = 0;
        panelCentro.add(lblNombrePoblacion, c);
        c.gridx = 1;
        c.gridy = 0;
        panelCentro.add(txtNombrePoblacion, c);
        contentPane.add(panelCentro, BorderLayout.CENTER);
        
        //Panel inferior
        JPanel panelInferior = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panelInferior.add(lblAviso);
        panelInferior.add(btnCancelar);
        panelInferior.add(btnAceptar);
        contentPane.add(panelInferior, BorderLayout.SOUTH);
    }

    /**
     * Devuelve el nombre del experimento
     * @return String nombreExperimento
     */
    public String getNombrePoblacion() {
        return txtNombrePoblacion.getText();
    }

    /**
     * Devuelve la acción producida
     * @return int action
     */
    public int getAction() {
        return action;
    }
    
    /**
     * Evento que se produce al tippear el nombre de la población, comprueba si existe
     */
    private class CambioNombrePoblacion extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
            //Comprobamos si el experimento existe en la ruta dada
            String nombre;
            
            if(e.getModifiers() == 0) {
                //Controlamos si borramos
                if((int)e.getKeyChar() == 8) {
                    if(txtNombrePoblacion.getText().isEmpty()) {
                        nombre = "";
                    } else {
                        nombre = txtNombrePoblacion.getText();
                    }
                } else if((int)e.getKeyChar() == 10) {
                    //Si pulsamos intro no hacemos nada
                    nombre = txtNombrePoblacion.getText();
                }
                else {
                    nombre = txtNombrePoblacion.getText() + e.getKeyChar();
                }
            } else {
                //No se ha introducido texto, no añadimos el caracter
                if(txtNombrePoblacion.getText().isEmpty()) {
                    nombre = "";
                } else {
                    nombre = txtNombrePoblacion.getText();
                }
            }
            
            ArrayList<LogicPoblacion> poblaciones = experimento.getPoblaciones();
            
            boolean repetido = false;
            for(int i=0; i<poblaciones.size() && !repetido; i++) {
                if(nombre.equals(poblaciones.get(i).getNombrePoblacion())) {
                    repetido = true;
                }
            }
            
            if(repetido) {
                lblAviso.setText(Language.getI().getP("POBLACION_EXISTE"));
            } else {
                if(nombre.isEmpty()) {
                    lblAviso.setText(Language.getI().getP("NOMBRE_NO_PUEDE_VACIO"));
                } else {
                    lblAviso.setText("");
                }
            }
        }
    }
    
    /**
     * Evento producido al pulsar aceptar
     */
    private class PulsadoAceptar implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            aceptarAccion();
        }
    }
    
    /**
     * Acción produccida al aceptar
     */
    private void aceptarAccion() {
        if(estanTextosIntroducidos()) {
            if(lblAviso.getText().isEmpty()) {
                action = ACEPTAR;
                setVisible(false);
            }
        } else {
            JOptionPane.showMessageDialog(Practica1.getInstance(),
                Language.getI().getP("FALTAN_DATOS"),
                Language.getI().getP("ADVERTENCIA"),
                JOptionPane.WARNING_MESSAGE);
        }
    }
    
    /**
     * Evento producido al pulsar en cancelar
     */
    private class PulsadoCancelar implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            action = CANCELAR;
            setVisible(false);
        }
    }
    
    /**
     * Evento producido al pulsar intro en un JTextField
     */
    private class PulsadoIntro implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            aceptarAccion();
        }
    }
    
    /**
     * Comprueba si están todos los textos introducidos
     * @return Si están todos los textos introducidos devuevlve verdad, sino falso
     */
    private boolean estanTextosIntroducidos() {
        return !txtNombrePoblacion.getText().isEmpty();
    }
}
